/*
 * exame_2010_11_setembro_vsleep.c
 *
 *  Created on: Jun 9, 2012
 *      Author: ubuntu
 */

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include<signal.h>

void ticTac(int signo) {

}

int main(int argc, char **argv) {
	if (argc != 2) {
		fprintf(stderr, "Usage: %s <n> [n -> Segundos]\n", argv[0]);
		exit(EXIT_FAILURE);
	}

	int numeroSegundos = atoi(argv[1]);

	int countSegundos = 0;

	int pid = fork();

	switch (pid) {
	case 0: {
		int flagTic = 1;
		while (1) {
			if (flagTic == 1) {
				printf("tic\n");
				flagTic = 0;
			} else {
				printf("tac\n");
				flagTic = 1;
			}
			kill(getpid(), SIGSTOP);
		}
		break;
	}
	default:
		while (countSegundos < numeroSegundos) {
			// armadilhar o gajo
			signal(SIGALRM, ticTac);
			alarm(1);

			// Ao recebermos o SIGALRM solicitado com alarm,
			// o seguinte wait vai retornar com código de erro -1
			// porque foi interrompido por um system call
			// mas que no nosso caso é exactamente o que queremos: ter o wait interrompido ao fim de 1segundo
			int result = wait(NULL);
			// result será sempre -1
			// printf("%d\n",result);

			// Descrição do erro será:
			// wait: Interrupted system call
			// perror("wait");

			kill(pid, SIGCONT);

			countSegundos++;
		}

		// por fim, matar o filho, q sinistro :)
		kill(pid, SIGKILL);

		break;
	}
}
